﻿using System;

namespace 静态_static
{
    class Program
    {
        static void Main(string[] args)
        {
            // static :静态的
            // 静态：静止的状态，石头，山。桌子，相对而言就叫 动态
            // static 修饰的字段 是专属于 类类型，不属于特定的对象（实例）。
            // static 用于修饰：类型本身、字段，方法、属性、事件，构造函数
            // static 不能用于： 索引器、析构函数
            // static 修饰的构造函数，不允许出现访问修饰符，就算你是 public 
            // static 修饰的构造函数，必须无参数
            // static 修饰的常规方法、构造方法属性 中不能出现 实例对象的成员（this）,这些逻辑用来操作 静态的类类型成员
            // static 修饰的构造函数全局只执行一次，自动执行，并且执行的时机比常规构造函数要早。静态构造和常规构造可以共存
            // 在创建第一个实例或引用任何静态成员之前，将自动调用静态构造函数来初始化类。
            // static  修饰的构造函数无法调用
            // 因为静态构造函数的优先级且唯一执行的特性用于加载配置很好用
            // Pinvoke 构造
            //静态类调用方法：类名.静态成员 非静态类调用方法;通过new出实例对象来调用方法。
            ///快捷键 prop 属性：property
            Console.WriteLine($"骨骼数量是{person.size}");//调用静态修饰的方法和字段使用类名.出来，不可以进行实例，实例是用于非静态类成员
            person s = new person();
            s.Eat("宫保鸡丁");
            //person.Eat();
            
        }
    }
    class person
    {
        public  string name = "憨憨";//这个字段是属于类的本身，不属于实例，通过类名.出来。
        //人体的骨骼数量，static 表示它不属于特定对象的成员，它属于这个类类型
        public static int size = 206;
        public static int Size { get; set; } //快捷键 prop = property： 属性 
       // public static event Action OnEatAnything; //事件的写法

        static person()//静态构造函数比非静态构造函数的优先级要高且执行一次
                       //静态构造函数是不可以加访问修饰符的
        {
            // 不能用实例引用（this）,来访问类类型的静态成员
            //this.name = name;
            //this.size = size;
            Console.WriteLine("dididdi ");
            size = 207;
        }
        public person()
        {
            Console.WriteLine("aaaaaaa1");
        }
        public void Eat(string food)
        {
            Console.WriteLine($"{this.name}吃的是{food}");
            //非静态类可以访问静态成员，这的静态成员是Function
            Function();
        }
        public static void Function()
        {
            Console.WriteLine("aaaaaaaaaaaaaaaa");
        }
        string a = "";
        //static 对索引器无需，很好理解因为用到了 this 关键字，而this关键字是表示某一个对象实例
        //public static string this[int index] { get { return a; } set { a = value; } }

        /* static 对析构函数无效
          static~person()
         {

         }
         ~static perosn()
         {

         }
        */
    }
    //static修饰的类不可以声明实例成员
    static class Dog//静态类不可以被继承，即使子类也是静态类
    {
        //public void a() { }不可以出现实例成员
        public static string name;
        public static void Eat()
        {
            Console.WriteLine("我是够");
        }
    }
    //static class Dogg :Dog{ }//dog 无法派生出 dogg，因为 dog 为静态
    // class DOGG : Dog() { }
}
